
#include <gtest.h>
#include <uWS.h>

// uWebsocket应该按以下方式理解
//   Backend 包括Loop, Async, Timer, Poll 用于描述最基本的网络通信运行模型
//   Poll->Socket->HttpSocket->WebSocket 用于描述应用于网络链接的业务处理逻辑，
//   最终需把实现的逻辑注册到Group中
//   NodeData->Group NodeData用于描述把Poll的处理逻辑，如内存分配释放，
//   Group则定义如何响应网络事件
//   Node->Hub 逻辑实现，把Poll+Loop组合起来，如客户端/服务器的最终实现
//
// 关于Socket
//   完成基本的操作，如读写连接监听，协议解析
//
// 关于NodeData & Group
//   NodeData中包含SocketData，SocketData是用于保存消息队列的Socket上下文，每个消息可以绑定一个回调函数
//   NodeData中绑定了多个Async？？这是针对每个特定的Poll的调用，通过NodeData共享时钟？？
//   Group认为一个Node包含了多种处理逻辑，但是因为他们是相同的，所以可以采取同样的处理逻辑，同时，一些基于Group
//   行为的命令，如broadcast，采用同一的实现方式来做
//
// 关于Node & Hub
//   Node包括了connect()和相应的callback，以及listen和相应的callback实现，Node自带fd，初始化后保存在NodeData->user
//   Hub整合了Node和Group
//
// How to hack
//   1. 在Node初始化回调时，增加初始化Zmqsocket的处理
//   2. 如果需要增加对zmq的处理，需要在Socket的基础上做ZmqSocket延伸，
//      然后通过初始化函数处理，注入到loop中，参考void Hub::onClientConnection
//   3. 实现ZmqSocket::onData，完成对逻辑的处理
//

int UwsCreateHub() {
  uWS::Hub hub;

  hub.onMessage([](uWS::WebSocket<uWS::SERVER>* ws, char* message,
                   size_t length, uWS::OpCode opCode) {
    ws->send(message, length, opCode);
    // 初始化VM？
  });

  hub.listen(5555);
  hub.run();

  return 0;
}

TEST(UWSTest, HandleNoneZeroInput) {
  EXPECT_EQ(0, UwsCreateHub());
}